/*
This is part of Screenbar, which is based in part on the Litestep
shell source code.

Copyright (C) 2008-2009 Jim Babcock
Copyright (C) 1997-2009 The LiteStep Development Team

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/
#pragma once

#define PROCESSDATA_NUM_TIMESAMPLES 8

class ProcessData
{
public:
	ProcessData(DWORD pid);
	
	void addTimeSample(UINT64 timeUsed, UINT64 timeRecorded);
	float getCPUUsage();
	void setMemUsage(size_t bytesUsed);
	size_t getMemUsage();
	
	DWORD pid;
	bool visited;
	
protected:
	struct TimeSample {
		UINT64 used;
		UINT64 recorded;
	};
	TimeSample timeSamples[PROCESSDATA_NUM_TIMESAMPLES];
	int numTimeSamples;
	
	size_t memUsage;
	
	ProcessData *parent;
	vector<ProcessData*> children;
};

class ProcessTracker
{
public:
	ProcessTracker();
	~ProcessTracker();
	
	void update();
	
	ProcessData *getProcess(DWORD pid);
	void getTaskProcesses(vector<ProcessData*> *outProcesses, TaskData *task);
	void getNonTaskProcesses(vector<ProcessData*> *outProcesses, TaskData *task);
	int getNumProcessors();
	
protected:
	map<DWORD, ProcessData*> processes;
	int numProcessors;
	
	void ProcessTracker::addProcess(DWORD pid);
	void ProcessTracker::updateProcess(ProcessData *process);
	void ProcessTracker::removeProcess(ProcessData *process);
};
extern ProcessTracker *processTracker;
